package org.example.zuoye.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.jasypt.util.password.PasswordEncryptor;
import org.jasypt.util.password.StrongPasswordEncryptor;

import java.time.Instant;
import java.util.Map;
import java.util.UUID;

/**
 * @Author xinchen
 * @Date: 2024/08/13/ 22:15
 * @Description
 */
public class JwtUtils {
    /**
     * 生成token
     * @param payload 有效载荷，主体数据
     * @param secret 密钥，在服务器保存
     * @return jwt令牌（字符）
     */
    public static String encode(String user,Map<String, Object> payload, String secret){
        JWTCreator.Builder builder = JWT.create();
        // 添加数据
        // 指定令牌用户
        builder.withAudience(user);
        // 指定过期时间
        builder.withExpiresAt(Instant.now().plusSeconds(1800));
        // 颁发时间
        builder.withIssuedAt(Instant.now());
        // 颁发者
        builder.withIssuer("admin");
        // 随机的字符串(生成唯一) 令牌编号
        builder.withJWTId(UUID.randomUUID().toString());
        // 主题
        builder.withSubject("jwt");
        // 现在
        builder.withNotBefore(Instant.now());
        // 添加有效载荷

        payload.forEach((k,v)->{
            // 添加有效载荷 依次放入
            builder.withClaim(k,v.toString());
        });

        return builder.sign(Algorithm.HMAC256(secret));
    }

    /**
     * 解密jwt
     * @param token jwt令牌
     * @param secret 密钥
     * @return DecodedJWT解密之后的jwt
     */
    public static DecodedJWT decode(String token, String secret) {
      return JWT.require(Algorithm.HMAC256(secret)).build().verify(token);
    }
    public static void main(String[] args) {
        // String str = "19819138513";
        // String md5 = DigestUtils.md5DigestAsHex(str.getBytes(StandardCharsets.UTF_8));
        // System.out.println(md5);

        // 数据铭文校验
        PasswordEncryptor pe  = new StrongPasswordEncryptor();
        System.out.println(pe.encryptPassword("123456"));
        String pwd = "123456";
        System.out.println(pe.checkPassword(pwd,"60jhoUNyo32rBlmvChTjN3F030qOndNJb1K6YLJpzh3WusfOOFByFdGmiJczQ0j2"));
        return ;
    }
}
